#include "keyboardbutton.h"
#include <QStyleOption>
#include <QFont>
#include <QFontMetrics>
#include <QPropertyAnimation>
#include <QEasingCurve>
#include <QResizeEvent>

KeyboardButton::KeyboardButton(const QString &text, QWidget *parent)
    : QPushButton(text, parent)
    , m_value(text)
    , m_isFunction(false)
    , m_sizeType(Normal)
    , m_isPressed(false)
    , m_isHovered(false)
    , m_pressTimer(new QTimer(this))
{
    setupStyle();
    connect(this, &QPushButton::clicked, this, &KeyboardButton::onClicked);
}

KeyboardButton::KeyboardButton(const QString &text, const QString &value, QWidget *parent)
    : QPushButton(text, parent)
    , m_value(value)
    , m_isFunction(false)
    , m_sizeType(Normal)
    , m_isPressed(false)
    , m_isHovered(false)
    , m_pressTimer(new QTimer(this))
{
    setupStyle();
    connect(this, &QPushButton::clicked, this, &KeyboardButton::onClicked);
}

void KeyboardButton::setValue(const QString &value)
{
    m_value = value;
}

QString KeyboardButton::getValue() const
{
    return m_value;
}

void KeyboardButton::setFunctionKey(bool isFunction)
{
    m_isFunction = isFunction;
    updateButtonStyle();
}

bool KeyboardButton::isFunctionKey() const
{
    return m_isFunction;
}

void KeyboardButton::setSizeType(SizeType type)
{
    m_sizeType = type;
    updateButtonStyle();
}

KeyboardButton::SizeType KeyboardButton::getSizeType() const
{
    return m_sizeType;
}

void KeyboardButton::setupStyle()
{
    // 设置默认最小尺寸，确保触摸友好
    setMinimumSize(60, 50);
    
    // 设置初始字体大小
    QFont font = this->font();
    font.setPointSize(24);  // 设置初始字体大小
    font.setBold(true);
    setFont(font);
    
    // 设置按键样式
    updateButtonStyle();
    
    // 设置焦点策略
    setFocusPolicy(Qt::NoFocus);
    
    // 延迟字体大小更新，防止初始化时问题
    QTimer::singleShot(0, this, &KeyboardButton::updateFontSize);
}

void KeyboardButton::updateButtonStyle()
{
    QString baseStyle = 
        "KeyboardButton {"
        "    border: 1px solid #666666;"
        "    border-radius: 6px;"
        "    background-color: %1;"
        "    color: %2;"
        "    font-weight: bold;"
        "    padding: 2px;"
        "    min-width: 30px;"
        "    min-height: 30px;"
        "}"
        "KeyboardButton:hover {"
        "    border-color: #888888;"
        "    background-color: %3;"
        "}"
        "KeyboardButton:pressed {"
        "    border-color: #aaaaaa;"
        "    background-color: %4;"
        "}";
    
    // 统一所有按键背景色为 rgb(53, 50, 47)
    QString normalBg = "rgb(53, 50, 47)";
    QString normalText = "#ffffff";
    QString hoverBg = "rgb(73, 70, 67)";  // 悬停时稍微亮一点
    QString pressedBg = "rgb(33, 30, 27)";  // 按下时稍微暗一点
    
    if (m_isFunction) {
        // 功能键也使用统一背景色，仅通过文字颜色区分
        normalBg = "rgb(53, 50, 47)";
        normalText = "#87CEEB";  // 功能键使用浅蓝色文字
        hoverBg = "rgb(73, 70, 67)";
        pressedBg = "rgb(33, 30, 27)";
    }
    
    setStyleSheet(baseStyle.arg(normalBg, normalText, hoverBg, pressedBg));
    
    // 不再在这里设置固定尺寸，由布局代码负责设置按键尺寸
    // 保持按键能够使用在simplekeyboard.cpp中设置的动态尺寸
}

void KeyboardButton::updateFontSize()
{
    // 根据按键尺寸动态计算字体大小
    int buttonWidth = width();
    int buttonHeight = height();
    
    // 如果按键尺寸为0（初始化时），使用最小尺寸
    if (buttonWidth <= 0 || buttonHeight <= 0) {
        buttonWidth = qMax(minimumWidth(), 60);
        buttonHeight = qMax(minimumHeight(), 50);
    }
    
    // 按按键尺寸比例计算字体大小，简洁模式需要更大字体
    int avgButtonSize = (buttonWidth + buttonHeight) / 2;
    
    int fontSize;
    // 根据简洁模式规范，使用更大的字体尺寸
    if (avgButtonSize <= 80) {
        fontSize = 24;  // 小按键
    } else if (avgButtonSize <= 110) {
        fontSize = 32;  // 中等按键
    } else if (avgButtonSize <= 150) {
        fontSize = 40;  // 大按键
    } else {
        fontSize = 48;  // 超大按键
    }
    
    // 限制字体大小范围，防止异常值
    fontSize = qMax(12, qMin(fontSize, 72));
    
    QFont font = this->font();
    font.setPointSize(fontSize);
    font.setBold(true);
    setFont(font);
    
    // 强制更新样式
    update();
}

void KeyboardButton::paintEvent(QPaintEvent *event)
{
    QPushButton::paintEvent(event);
}

void KeyboardButton::mousePressEvent(QMouseEvent *event)
{
    if (event->button() == Qt::LeftButton) {
        m_isPressed = true;
        update();
    }
    QPushButton::mousePressEvent(event);
}

void KeyboardButton::mouseReleaseEvent(QMouseEvent *event)
{
    if (event->button() == Qt::LeftButton) {
        m_isPressed = false;
        
        // 使用简单的定时器替代复杂的动画
        if (!m_pressTimer->isActive()) {
            m_pressTimer->setSingleShot(true);
            m_pressTimer->setInterval(50); // 50ms的简单回弹效果
            connect(m_pressTimer, &QTimer::timeout, this, &KeyboardButton::onReleaseAnimation);
            m_pressTimer->start();
        }
        
        update();
    }
    QPushButton::mouseReleaseEvent(event);
    
    // 修复：确保按钮不会获取焦点，避免输入框失去焦点
    if (parentWidget()) {
        parentWidget()->setFocus();
    }
}

void KeyboardButton::onReleaseAnimation()
{
    // 简单的回弹效果
    update();
}

void KeyboardButton::enterEvent(QEvent *event)
{
    m_isHovered = true;
    update();
    QPushButton::enterEvent(event);
}

void KeyboardButton::leaveEvent(QEvent *event)
{
    m_isHovered = false;
    update();
    QPushButton::leaveEvent(event);
}

void KeyboardButton::onClicked()
{
    emit keyPressed(m_value);
}

void KeyboardButton::resizeEvent(QResizeEvent *event)
{
    QPushButton::resizeEvent(event);
    // 在按键尺寸改变时更新字体大小
    updateFontSize();
}
